// 声明一个类
// 类的属性都是实例属性 方法都是实例方法
class Dog {
  constructor(name: string) {
    this.name = name
  }
  public name: string  // 默认都是public 也可以声明
  run() { }
  private pri() { }  // 只能在类的本身调用 不能被实例调用  也不能被子类调用
  protected pro() { }  // 受保护成员 只能在类或子类中访问  不能被实例调用
  readonly legs: number = 4  // 只读属性  这个属性是不能被更改的 要初始化
  static food: string = 'bones' // 只能通过类名调用  不允许通过子类访问
}
console.log(Dog.prototype)
let dog = new Dog('wangwang')
console.log(dog)
// dog.pri()
// dog.pro()

//类的继承  子类
class Husky extends Dog {
  constructor(name: string, public color: string) {
    super(name)
    this.color = color
    // this.pri()
    this.pro()
  }
  // color: string
}

//类的成员修饰符
//pubilc private protected  readonly static


// 抽象类与多态类
abstract class Animal {
  eat() {
    console.log('eat')
  }
  abstract sleep(): void
}

class bird extends Animal {
  constructor(name: string) {
    super()
    this.name = name
  }
  name: string
  run() { }
  sleep() {
    console.log('dog sleep')
  }
}
let bird1 = new bird("hahhh")
bird1.eat()


// 多态
class Cat extends Animal {
  sleep() {
    console.log('cat sleep')
  }
}
let cat = new Cat()

let animals: Animal[] = [bird1, cat]
animals.forEach(i => {
  i.sleep()
})


class WorkFlow {
  step1() {
    return this
  }
  step2() {
    return this
  }
}
new WorkFlow().step1().step2()

class MyFlow extends WorkFlow {
  next() {
    return this
  }
}
new MyFlow().next().step1().next().step2()